<?php
// +----------------------------------------------------------------------
// | Author: wyd 2025/11/6
// | DESC: 
// +----------------------------------------------------------------------

declare (strict_types=1);

// 协程异步 - 并发执行，用WaitGroup等待所有完成
use Swoole\Coroutine\Http\Client;
use Swoole\Coroutine\WaitGroup;
use function Swoole\Coroutine\run;

//$wg = new WaitGroup();
//$wg->add(3);
//
//go(function () use ($wg) {
//    doTask1(); // 异步执行，不阻塞
//    $wg->done();
//});
//
//go(function () use ($wg) {
//    doTask2(); // 异步执行，不阻塞
//    $wg->done();
//});
//
//go(function () use ($wg) {
//    doTask3(); // 异步执行，不阻塞
//    $wg->done();
//});
//
//$wg->wait(); // 等待所有异步任务完成
//// 总时间：约10秒（三个任务并发执行）

/****************************************************************************************************************/
/**错误写法*/
//\Swoole\Coroutine\run(function () {
//    $wg = new WaitGroup();
//
//    $wg->add();
//    go(function () use ($wg) {
//        defer(function () use ($wg) {
//            echo "defer开始\n";
//
//            // 故意抛出异常
//            throw new Exception("测试异常");
//
//            // 这行不会执行
//            echo "这行不会输出\n";
//            $wg->done();
//        });
//
//        echo "协程主体\n";
//    });
//
//    echo "等待开始\n";
//    $wg->wait(2); // 设置2秒超时
//    echo "等待结束\n";
//});

///**正确写法*/
////defer中 使用try-catch
//defer(function () use ($pool, $conn, $wg) {
//    try {
//        $pool->close($conn);
//    } catch (Exception $e) {
//        // 记录日志
//    } finally {
//        $wg->done(); // 确保一定执行
//    }
//});


run(function () {
    $wg = new WaitGroup();
    $result = [];

    $wg->add();
    //启动第一个协程
    go(function () use ($wg, &$result) {
        //启动一个协程客户端client，请求淘宝首页
        $cli = new Client('www.taobao.com', 443, true);
        $cli->setHeaders([
            'Host' => 'www.taobao.com',
            'User-Agent' => 'Chrome/49.0.2587.3',
            'Accept' => 'text/html,application/xhtml+xml,application/xml',
            'Accept-Encoding' => 'gzip',
        ]);
        $cli->set(['timeout' => 1]);
        $cli->get('/index.php');

        $result['taobao'] = $cli->body;
        $cli->close();

        $wg->done();
    });

    $wg->add();
    //启动第二个协程
    go(function () use ($wg, &$result) {
        //启动一个协程客户端client，请求百度首页
        $cli = new Client('www.baidu.com', 443, true);
        $cli->setHeaders([
            'Host' => 'www.baidu.com',
            'User-Agent' => 'Chrome/49.0.2587.3',
            'Accept' => 'text/html,application/xhtml+xml,application/xml',
            'Accept-Encoding' => 'gzip',
        ]);
        $cli->set(['timeout' => 1]);
        $cli->get('/index.php');

        $result['baidu'] = $cli->body;
        $cli->close();

        $wg->done();
    });

    //挂起当前协程，等待所有任务完成后恢复
    $wg->wait();
    //这里 $result 包含了 2 个任务执行结果
    var_dump($result);
});